/*************************************************************************
	> File Name: include/test.c
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月07日 星期六 20时58分23秒
 ************************************************************************/
#include <stdio.h>
#include <string.h>
#include <include/test.h>
#include <include/linklist.h>
#include <stdlib.h>
int func_cnt = 0;
//先定义一个Funtion结构体类型的变量func_head表示链表的头部,
//并初始化Function*结构体指针类型的变量func_tail指向func_head的地址
Function func_head, *func_tail = &func_head;

int RUN_ALL_TEST() {
    for (struct LinkNode *p = func_head.p.next; p; p = p->next) {
        Function *run_func = Head(p, Function, p);
        printf(GREEN("[----RUN----] "RED("%s\n")), run_func->str);
        mytest_info.total = 0, mytest_info.success = 0;
        run_func->func();
        double rate = 1.0 * mytest_info.success / mytest_info.total;
        rate *= 100.0;
        printf(GREEN("[  "));
        if (mytest_info.total == mytest_info.success) {
            printf(BLUE_HL("100.00%%"));
        } else {
            printf(RED_HL("%6.2lf%%"), rate);
        }
        printf(GREEN("  ] ") "total: %d\tsuccess: %d\n", 
            mytest_info.total,
            mytest_info.success
        );
    }
    return 0;
}

void add_function(TestFuncT func, const char *str) {
//每次调用添加函数指针的函数时，动态开辟一个Function类型的指针temp，
//将该指针指向的结构体的LinkNode p成员的地址赋值给func_tail->p.next  
//然后更新func_tail的地址为temp的值。
//通过这个func_tail变量，相当于对这个链表进行了尾插。  
    Function *temp = (Function *)calloc(1, sizeof(Function));
    temp->func = func;
    temp->str = strdup(str);
    func_tail->p.next = &(temp->p);
    func_tail = temp;
    func_cnt++;
    return ;
}
